#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
RocketMQ 演示运行脚本
统一运行各种演示示例
"""

import sys
import os
import time
import logging
from config import LOGGING_CONFIG, check_config, configure_rocketmq, save_config

# 配置日志
logging.basicConfig(
    level=getattr(logging, LOGGING_CONFIG["level"]), 
    format=LOGGING_CONFIG["format"]
)
logger = logging.getLogger(__name__)


def print_banner():
    """打印欢迎横幅"""
    banner = """
╔══════════════════════════════════════════════════════════════╗
║                    RocketMQ Python 演示                      ║
║                                                              ║
║  一个完整的 RocketMQ Python 客户端演示项目                   ║
║  展示如何使用 Python 发送和消费 RocketMQ 消息               ║
╚══════════════════════════════════════════════════════════════╝
"""
    print(banner)


def check_and_configure():
    """检查并配置 RocketMQ 连接信息"""
    print("🔍 检查 RocketMQ 配置...")
    
    # 检查配置是否完整
    missing_fields = check_config()
    
    if missing_fields:
        print(f"❌ 配置不完整，缺少: {', '.join(missing_fields)}")
        print("\n" + "="*60)
        print("⚠️  首次使用需要配置 RocketMQ 连接信息")
        print("="*60)
        print("请按提示输入以下信息：")
        print("1. NameServer 地址 (例如: localhost:9876)")
        print("2. Access Key (如果启用 ACL)")
        print("3. Secret Key (如果启用 ACL)")
        print()
        
        # 运行配置向导
        if configure_rocketmq():
            # 询问是否保存配置
            save_choice = input("\n是否保存配置到文件? (Y/n): ").strip().lower()
            if save_choice not in ['n', 'no', '否']:
                if save_config():
                    print("✓ 配置已保存到 config.py")
                else:
                    print("⚠ 配置保存失败，但可以继续使用")
            return True
        else:
            print("❌ 配置失败，请重新运行程序")
            return False
    else:
        print("✓ 配置已完整")
        return True


def print_menu():
    """打印菜单"""
    menu = """
请选择要运行的演示:

1. 生产者演示 (producer_demo.py)
   - 同步发送消息
   - 支持消息标签和键
   - 批量发送演示

2. 消费者演示 (consumer_demo.py)
   - 推模式消费消息
   - 消息过滤和处理
   - 实时消息接收

3. 生产消费一体化演示 (producer_consumer_demo.py)
   - 同时运行生产者和消费者
   - 完整的消息流转演示
   - 多线程处理

4. 异步生产者示例 (examples/async_producer.py)
   - 异步消息发送
   - 回调处理
   - 高性能发送

5. 批量生产者示例 (examples/batch_producer.py)
   - 批量消息发送
   - 性能优化演示
   - 不同批量大小测试

6. 有序消费者示例 (examples/orderly_consumer.py)
   - 有序消息消费
   - 队列级别顺序保证
   - 顺序处理演示

7. 重新配置 RocketMQ 连接

0. 退出

请输入选项 (0-7): """
    return input(menu)


def run_demo(demo_name, description):
    """运行指定的演示"""
    logger.info(f"=== 运行 {description} ===")
    
    try:
        # 导入并运行演示
        if demo_name == "producer_demo":
            from producer_demo import main
        elif demo_name == "consumer_demo":
            from consumer_demo import main
        elif demo_name == "producer_consumer_demo":
            from producer_consumer_demo import main
        elif demo_name == "async_producer":
            sys.path.append("examples")
            from async_producer import main
        elif demo_name == "batch_producer":
            sys.path.append("examples")
            from batch_producer import main
        elif demo_name == "orderly_consumer":
            sys.path.append("examples")
            from orderly_consumer import main
        else:
            logger.error(f"未知的演示: {demo_name}")
            return False
        
        # 运行演示
        main()
        return True
        
    except ImportError as e:
        logger.error(f"导入演示模块失败: {e}")
        logger.error("请确保已安装所有依赖包: pip install -r requirements.txt")
        return False
    except Exception as e:
        logger.error(f"运行演示失败: {e}")
        return False


def check_dependencies():
    """检查依赖"""
    try:
        import rocketmq.client
        logger.info("✓ RocketMQ Python 客户端已安装")
        return True
    except ImportError as e:
        logger.error("✗ RocketMQ Python 客户端未安装")
        logger.error("请运行: pip install -r requirements.txt")
        return False
    except OSError as e:
        logger.error("✗ RocketMQ 客户端库加载失败")
        logger.error(f"错误信息: {e}")
        logger.error("可能是架构不兼容，请检查系统架构和库版本")
        return False
    except Exception as e:
        logger.error(f"✗ 依赖检查失败: {e}")
        return False


def show_current_config():
    """显示当前配置"""
    try:
        from config import ROCKETMQ_CONFIG
        print("\n当前配置:")
        print(f"  - NameServer: {ROCKETMQ_CONFIG['namesrv_addr']}")
        print(f"  - 主题: {ROCKETMQ_CONFIG['default_topic']}")
        print(f"  - 生产者组: {ROCKETMQ_CONFIG['producer_group']}")
        print(f"  - 消费者组: {ROCKETMQ_CONFIG['consumer_group']}")
        print()
    except Exception as e:
        logger.error(f"读取配置失败: {e}")


def main():
    """主函数"""
    print_banner()
    
    # 检查依赖（但不强制要求）
    dependencies_ok = check_dependencies()
    if not dependencies_ok:
        print("\n⚠️  依赖检查失败，但可以继续配置")
        print("配置完成后，请解决依赖问题再运行演示")
        print()
    
    # 检查并配置 RocketMQ 连接信息
    if not check_and_configure():
        return
    
    # 显示当前配置
    show_current_config()
    
    # 如果依赖有问题，只允许配置
    if not dependencies_ok:
        print("由于依赖问题，当前只能进行配置")
        print("请解决依赖问题后重新运行程序")
        return
    
    while True:
        try:
            choice = print_menu().strip()
            
            if choice == "0":
                logger.info("退出演示程序")
                break
            elif choice == "1":
                run_demo("producer_demo", "生产者演示")
            elif choice == "2":
                run_demo("consumer_demo", "消费者演示")
            elif choice == "3":
                run_demo("producer_consumer_demo", "生产消费一体化演示")
            elif choice == "4":
                run_demo("async_producer", "异步生产者示例")
            elif choice == "5":
                run_demo("batch_producer", "批量生产者示例")
            elif choice == "6":
                run_demo("orderly_consumer", "有序消费者示例")
            elif choice == "7":
                # 重新配置
                if configure_rocketmq():
                    save_choice = input("\n是否保存配置到文件? (Y/n): ").strip().lower()
                    if save_choice not in ['n', 'no', '否']:
                        if save_config():
                            print("✓ 配置已保存到 config.py")
                        else:
                            print("⚠ 配置保存失败，但可以继续使用")
                    show_current_config()
                else:
                    print("❌ 配置失败")
            else:
                logger.error("无效选项，请重新选择")
                continue
            
            # 询问是否继续
            print("\n" + "="*60)
            continue_choice = input("是否继续运行其他演示? (y/n): ").strip().lower()
            if continue_choice not in ['y', 'yes', '是']:
                logger.info("退出演示程序")
                break
                
        except KeyboardInterrupt:
            logger.info("\n用户中断，退出演示程序")
            break
        except Exception as e:
            logger.error(f"程序运行错误: {e}")
            break


if __name__ == "__main__":
    main() 